[Amazon FSx for NetApp ONTAP] 指定したディレクトリ配下のみをSnapRestoreしたい
指定したディレクトリ配下のみをSnapRestoreしたい
こんにちは、のんピ(@non____97)です。
皆さんはAmazon FSx for NetApp ONTAP(以降FSxN)を使用していて、指定したディレクトリ配下のみをSnapRestoreしたいなと思ったことはありますか? 私はあります。
Snapshotはボリューム単位で取得することになります。この時、用途や非機能要件で適切にボリュームを分割していない場合はSnapshotからリストアするときの影響範囲が広くなります。FSxNにおけるボリュームやSVMなどの各種リソースの分割の考え方は以下記事をご覧ください。
そこで行いたくなるのはディレクトリ単位でのSnapRestoreです。特定のディレクトリ配下のファイルやディレクトリのみをSnapshot取得したタイミングに戻したいです。
実際にそのようなことが可能なの確認してみます。
いきなりまとめ
- 単一コマンドで指定したディレクトリ配下のみをSnapRestoreすることはできない
- 対応策は以下
- SnapRestoreによるリストアを行う場合 : ファイルのリストを作成してSSHで流すコマンドを組み立て実行する
- SnapRestoreによるリストアでなくとも良い場合 : cpコマンドやエクスプローラーの
以前のバージョン
機能を用いる
検証環境
検証環境は以下のとおりです。
以下記事で使用したものを再利用します。
検証用に以下のようにファイルおよびディレクトリを作成しています。
> ls -R \\SMB-SERVER.corp.non-97.net\share
Directory: \\SMB-SERVER.corp.non-97.net\share
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 8/30/2024 6:39 AM dir1
-a---- 8/30/2024 6:42 AM 18 test.txt
Directory: \\SMB-SERVER.corp.non-97.net\share\dir1
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 8/30/2024 6:39 AM dir2
-a---- 8/30/2024 6:42 AM 9 test2.txt
Directory: \\SMB-SERVER.corp.non-97.net\share\dir1\dir2
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 8/30/2024 6:42 AM 9 test3.txt
---
> cat \\SMB-SERVER.corp.non-97.net\share\test.txt
test.txt
> cat \\SMB-SERVER.corp.non-97.net\share\dir1\test2.txt
test2.txt
> cat \\SMB-SERVER.corp.non-97.net\share\dir1\dir2\test3.txt
test3.txt
ONTAP CLIでリストア
Snapshotの取得
まずはONTAP CLIでリストアできるか確認します。
Snapshotを取得します。
::> snapshot show -volume vol_ntfs
There are no entries matching your query.
::> snapshot create -vserver svm -volume vol_ntfs -snapshot test.2024-08-30_0648
::> snapshot show -volume vol_ntfs
---Blocks---
Vserver Volume Snapshot Size Total% Used%
-------- -------- ------------------------------------- -------- ------ -----
svm vol_ntfs
test.2024-08-30_0648 132KB 0% 22%
Snapshotからリストアした時にSnapshot取得時点に戻ったことを確認するために、各ファイルに追記を行います。
> echo msg1 >> \\SMB-SERVER.corp.non-97.net\share\test.txt
> echo msg2 >> \\SMB-SERVER.corp.non-97.net\share\dir1\test2.txt
> echo msg3 >> \\SMB-SERVER.corp.non-97.net\share\dir1\dir2\test3.txt
> cat \\SMB-SERVER.corp.non-97.net\share\test.txt
test.txt
msg1
> cat \\SMB-SERVER.corp.non-97.net\share\dir1\test2.txt
test2.txt
msg2
> cat \\SMB-SERVER.corp.non-97.net\share\dir1\dir2\test3.txt
test3.txt
msg3
SnapRestore
それではディレクトリを指定してSnapRestoreをします。
コマンドの詳細は以下記事をご覧ください。
::> snapshot restore?
restore Restore the volume to a snapshot.
restore-file Restore a file from a snapshot
::> snapshot restore-file -vserver svm -volume vol_ntfs -snapshot test.2024-08-30_0648 -path /dir1
Error: command failed: Failed to restore file from Snapshot copy test.2024-08-30_0648 for volume "vol_ntfs" on Vserver "svm". Reason: Inappropriate file type or format.
::*> snapshot restore-file -vserver svm -volume vol_ntfs -snapshot test.2024-08-30_0648 -path /dir1 -restore-path /dir1
Error: command failed: Failed to restore file from Snapshot copy test.2024-08-30_0648 for volume "vol_ntfs" on Vserver "svm". Reason: Inappropriate file type or format.
はい、リストアできませんでした。不適切なファイルタイプまたはフォーマットと表示されていますね。
これはsnapshot restore-file
の仕様です。
以下NetApp公式ドキュメントのとおり、ディレクトリをリストアしようとするとコマンドが失敗するとされています。
The command also supports restoring normal user-level files with streams. The command fails if you try to restore directories (and their contents).
ということで、ONTAP CLIの単一コマンドで指定したディレクトリ配下のファイルやディレクトリをリストアすることはできません。
snapshot restore-file
で大量のファイルをリストアしたい場合は、以下記事で紹介しているようにシェルスクリプトとSSHコマンドを組み合わせて対応することになると考えます。
PowerShellでSnapshot内のファイルを確認
シェルスクリプトとSSHコマンドを組み合わせるにあたって、そのSnapshot内にどんなファイルがあるかどうか知る必要があります。
Powershellを用いてSnapshotディレクトリにアクセスして、Snapshot内のファイルを確認します。
まず、SMBファイル共有直下の~snapshot
にアクセスします。
> ls \\SMB-SERVER.corp.non-97.net\share\~snapshot
Directory: \\SMB-SERVER.corp.non-97.net\share\~snapshot
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 8/30/2024 6:38 AM test.2024-08-30_0648
> ls -R \\SMB-SERVER.corp.non-97.net\share\~snapshot\test.2024-08-30_0648
Directory: \\SMB-SERVER.corp.non-97.net\share\~snapshot\test.2024-08-30_0648
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 8/30/2024 6:39 AM dir1
-a---- 8/30/2024 6:42 AM 18 test.txt
Directory: \\SMB-SERVER.corp.non-97.net\share\~snapshot\test.2024-08-30_0648\dir1
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 8/30/2024 6:39 AM dir2
-a---- 8/30/2024 6:42 AM 9 test2.txt
Directory: \\SMB-SERVER.corp.non-97.net\share\~snapshot\test.2024-08-30_0648\dir1\dir2
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 8/30/2024 6:42 AM 9 test3.txt
はい、各ファイルを確認することができました。
あとはPowershellで頑張ればファイルのリストを取得することができそうです。
実際にやってみましょう。
# ファイル共有配下のファイル一覧を出力
> Get-ChildItem -Path \\SMB-SERVER.corp.non-97.net\share -Recurse -File | Select-Object -ExpandProperty FullName
\\SMB-SERVER.corp.non-97.net\share\test.txt
\\SMB-SERVER.corp.non-97.net\share\dir1\test2.txt
\\SMB-SERVER.corp.non-97.net\share\dir1\dir2\test3.txt
# ファイル共有配下のファイル一覧を出力
# 出力結果から共有名までを除外
> Get-ChildItem -Path "\\SMB-SERVER.corp.non-97.net\share\" -Recurse -File |
Select-Object -ExpandProperty FullName |
ForEach-Object { $_ -replace '\\\\SMB-SERVER\.corp\.non-97\.net\\share\\', '' }
test.txt
dir1\test2.txt
dir1\dir2\test3.txt
問題なくできました。
実際にリストアする際は出力された結果を元にfor文でSSHで流すコマンドを生成しましょう。
続いて、SMBファイル共有のディレクトリ配下の~snapshot
にアクセスしてみます。
> ls -R \\SMB-SERVER.corp.non-97.net\share\dir1\~snapshot
Directory: \\SMB-SERVER.corp.non-97.net\share\dir1\~snapshot
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 8/30/2024 6:39 AM test.2024-08-30_0648
Directory: \\SMB-SERVER.corp.non-97.net\share\dir1\~snapshot\test.2024-08-30_0648
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 8/30/2024 6:39 AM dir2
-a---- 8/30/2024 6:42 AM 9 test2.txt
Directory: \\SMB-SERVER.corp.non-97.net\share\dir1\~snapshot\test.2024-08-30_0648\dir2
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 8/30/2024 6:42 AM 9 test3.txt
> ls -R \\SMB-SERVER.corp.non-97.net\share\dir1\dir2\~snapshot
Directory: \\SMB-SERVER.corp.non-97.net\share\dir1\dir2\~snapshot
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 8/30/2024 6:39 AM test.2024-08-30_0648
Directory: \\SMB-SERVER.corp.non-97.net\share\dir1\dir2\~snapshot\test.2024-08-30_0648
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 8/30/2024 6:42 AM 9 test3.txt
こちらも問題なくアクセスできました。SMBファイル共有のトップディレクトリにアクセス権限がなくとも、Snapshotディレクトリにはアクセスできるようですね。
ただし、エクスプローラーからは~snapshot
でSnapshotディレクトリにアクセスできませんでした。注意しましょう。
以前のバージョン
でリストア
エクスプローラーから次に、エクスプローラーから以前のバージョン
でリストアを確認します。
dir1
配下に移動して、Previous Versions
をクリックします。
すると、Snapshotを取得したタイミングに戻せそうです。
Open
をクリックするとエクスプローラーでSnapshot取得時点のファイルを確認することができました。
階層の移動も問題なく行えます。
Snapshotディレクトリのパスはファイル共有名\Snapshot取得日時
となっていました。
エクスプローラーのアドレスバーに\\SMB-SERVER.corp.non-97.net\share\@GMT-2024.08.30-06.48.54\dir1
と入力してもSnapshot取得時のdir1
を表示できました。
Previous Versionsからリストアします。
即リストアが完了したようです。
Powershellでdir1
配下のみSnapshot取得時点に戻ったことを確認します。
> ls -R \\SMB-SERVER.corp.non-97.net\share
Directory: \\SMB-SERVER.corp.non-97.net\share
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 8/30/2024 6:39 AM dir1
-a---- 8/30/2024 6:53 AM 38 test.txt
Directory: \\SMB-SERVER.corp.non-97.net\share\dir1
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 8/30/2024 6:39 AM dir2
-a---- 8/30/2024 6:42 AM 9 test2.txt
Directory: \\SMB-SERVER.corp.non-97.net\share\dir1\dir2
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 8/30/2024 6:42 AM 9 test3.txt
> cat \\SMB-SERVER.corp.non-97.net\share\test.txt
test.txt
msg1
> cat \\SMB-SERVER.corp.non-97.net\share\dir1\test2.txt
test2.txt
> cat \\SMB-SERVER.corp.non-97.net\share\dir1\dir2\test3.txt
test3.txt
dir1
配下のファイルは追記前の状態に戻っていますね。一方でtest.txt
は追記後の状態のままです。
FSxNでリストアしたタイミングの管理アクティビティの監査ログを確認します。
::*> security audit log show -fields timestamp, node, application, vserver, username, input, state, message -state Error|Success -timestamp >"Thu Aug 30 07:15:00 2024"
timestamp node application vserver username input state message
-------------------------- ------------------------- ----------- ---------------------- ----------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----- ---------------
"Fri Aug 30 07:15:38 2024" FsxId0e64a4f5386f74c87-01 http FsxId0e64a4f5386f74c87 fsx-control-plane POST /api/security/roles/0ca12dd2-6063-11ef-a92a-512f30fadf39/fsxadmin/privileges/storage%20aggregate%20object-store%20show-space : {"access":"readonly","query":"-aggregate !*"} Error duplicate entry
"Fri Aug 30 07:15:39 2024" FsxId0e64a4f5386f74c87-01 http FsxId0e64a4f5386f74c87 fsx-control-plane POST /api/security/roles/0ca12dd2-6063-11ef-a92a-512f30fadf39/fsxadmin-readonly/privileges/storage%20aggregate%20object-store%20show-space : {"access":"readonly","query":"-aggregate !*"}
Error duplicate entry
"Fri Aug 30 07:20:38 2024" FsxId0e64a4f5386f74c87-01 http FsxId0e64a4f5386f74c87 fsx-control-plane POST /api/security/roles/0ca12dd2-6063-11ef-a92a-512f30fadf39/fsxadmin/privileges/storage%20aggregate%20object-store%20show-space : {"access":"readonly","query":"-aggregate !*"} Error duplicate entry
"Fri Aug 30 07:20:39 2024" FsxId0e64a4f5386f74c87-01 http FsxId0e64a4f5386f74c87 fsx-control-plane POST /api/security/roles/0ca12dd2-6063-11ef-a92a-512f30fadf39/fsxadmin-readonly/privileges/storage%20aggregate%20object-store%20show-space : {"access":"readonly","query":"-aggregate !*"}
Error duplicate entry
"Fri Aug 30 07:21:34 2024" FsxId0e64a4f5386f74c87-01 ssh FsxId0e64a4f5386f74c87 fsxadmin Question: Warning: These diagnostic command... : y Success
-
"Fri Aug 30 07:21:34 2024" FsxId0e64a4f5386f74c87-01 ssh FsxId0e64a4f5386f74c87 fsxadmin set diag Success
-
6 entries were displayed.
特にログの記録はされていません。裏側でSnapRestoreのAPIが叩かれているわけではなさそうですね。
指定したディレクトリ配下のみSnapRestoreするのは一筋縄ではいかない
指定したディレクトリ配下のみをSnapRestoreできるかどうか検証してみました。
結論、単一のONTAP CLIコマンドではディレクトリ配下をピンポイントでリストアすることはできないことが分かりました。
どうしてもSnapRestoreで行う場合は、ファイルのリストを作成してSSHで流すコマンドを組み立てる必要があります。
もし、リストア方法にこだわりがないのであれば、cpコマンドやエクスプローラーの以前のバージョン
機能を用いてリストアしましょう。
この記事が誰かの助けになれば幸いです。
以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!